/*
 * Copyright 2013 The Netty Project
 *
 * The Netty Project licenses this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */
package io.netty.handler.codec.spdy;

import java.util.Set;

/**
 * A SPDY Protocol SETTINGS Frame
 */
public interface SpdySettingsFrame extends SpdyFrame
{

    int SETTINGS_MINOR_VERSION = 0;

    int SETTINGS_UPLOAD_BANDWIDTH = 1;

    int SETTINGS_DOWNLOAD_BANDWIDTH = 2;

    int SETTINGS_ROUND_TRIP_TIME = 3;

    int SETTINGS_MAX_CONCURRENT_STREAMS = 4;

    int SETTINGS_CURRENT_CWND = 5;

    int SETTINGS_DOWNLOAD_RETRANS_RATE = 6;

    int SETTINGS_INITIAL_WINDOW_SIZE = 7;

    int SETTINGS_CLIENT_CERTIFICATE_VECTOR_SIZE = 8;

    /**
     * Returns a {@code Set} of the setting IDs. The set's iterator will return
     * the IDs in ascending order.
     */
    Set<Integer> ids();

    /**
     * Returns {@code true} if the setting ID has a value.
     */
    boolean isSet(int id);

    /**
     * Returns the value of the setting ID. Returns -1 if the setting ID is not
     * set.
     */
    int getValue(int id);

    /**
     * Sets the value of the setting ID. The ID cannot be negative and cannot
     * exceed 16777215.
     */
    SpdySettingsFrame setValue(int id, int value);

    /**
     * Sets the value of the setting ID. Sets if the setting should be persisted
     * (should only be set by the server). Sets if the setting is persisted
     * (should only be set by the client). The ID cannot be negative and cannot
     * exceed 16777215.
     */
    SpdySettingsFrame setValue(int id, int value, boolean persistVal,
            boolean persisted);

    /**
     * Removes the value of the setting ID. Removes all persistence information
     * for the setting.
     */
    SpdySettingsFrame removeValue(int id);

    /**
     * Returns {@code true} if this setting should be persisted. Returns
     * {@code false} if this setting should not be persisted or if the setting
     * ID has no value.
     */
    boolean isPersistValue(int id);

    /**
     * Sets if this setting should be persisted. Has no effect if the setting ID
     * has no value.
     */
    SpdySettingsFrame setPersistValue(int id, boolean persistValue);

    /**
     * Returns {@code true} if this setting is persisted. Returns {@code false}
     * if this setting should not be persisted or if the setting ID has no
     * value.
     */
    boolean isPersisted(int id);

    /**
     * Sets if this setting is persisted. Has no effect if the setting ID has no
     * value.
     */
    SpdySettingsFrame setPersisted(int id, boolean persisted);

    /**
     * Returns {@code true} if previously persisted settings should be cleared.
     */
    boolean clearPreviouslyPersistedSettings();

    /**
     * Sets if previously persisted settings should be cleared.
     */
    SpdySettingsFrame setClearPreviouslyPersistedSettings(boolean clear);
}
